#pragma once

#include "SharedServer.hpp"


// // 定义SCAllocator模板类，遵循标准分配器的要求
// template<typename T>
// class SCAllocator
// {
// public:
//     using value_type = T;

//     SCAllocator() noexcept = default;
//     template<typename U> SCAllocator(const SCAllocator<U>&) noexcept {}

//     // 成员函数分配内存，调用SharedServer的allocate方法
//     T* allocate(std::size_t n) {
//         if (n > std::size_t(-1) / sizeof(T)) {
//             throw std::bad_alloc();
//         }
//         void* ptr = SharedServer::GetInstance()->allocate(n * sizeof(T));
//         if (!ptr) {
//             throw std::bad_alloc();
//         }
//         return static_cast<T*>(ptr);
//     }

//     // 成员函数释放内存，调用SharedServer的deallocate方法
//     void deallocate(T* ptr, std::size_t n) noexcept {
//         SharedServer::GetInstance()->deallocate(ptr);
//     }
// };

// // 判断两个分配器是否相等
// template<typename T, typename U>
// bool operator==(const SCAllocator<T>&, const SCAllocator<U>&) noexcept {
//     return true;
// }

// template<typename T, typename U>
// bool operator!=(const SCAllocator<T>&, const SCAllocator<U>&) noexcept {
//     return false;
// }

class SC
{
public:
    // 静态函数分配内存并构造对象
    template<typename T, typename... Args>
    static T* allocateMemory(Args&&... args) {
        // 分配内存
        void* ptr = SharedServer::GetInstance()->allocate(sizeof(T));
        if (!ptr) {
            throw std::bad_alloc();
        }

        // 构造对象
        return new(ptr) T(std::forward<Args>(args)...);
    }

    static void* allocateMemory(size_t size) {
        // 分配内存
        void* ptr = SharedServer::GetInstance()->allocate(size);
        if (!ptr) {
            throw std::bad_alloc();
        }

        // 构造对象
        return ptr;
    }

    // 静态函数释放内存并析构对象
    template<typename T>
    static void deallocateMemory(T* ptr) noexcept {
        if (ptr) {
            // 调用析构函数
            ptr->~T();

            // 释放内存
            SharedServer::GetInstance()->deallocate(ptr);
        }
    }

    static void deallocateMemory(void* ptr) noexcept {
        if (ptr) {

            // 释放内存
            SharedServer::GetInstance()->deallocate(ptr);
        }
    }
};
